#! /bin/sh
# PCP QA Test No. 034
# pmlogger with different logging rates
#
# Copyright (c) 1995-2002 Silicon Graphics, Inc.  All Rights Reserved.
#

seq=`basename $0`
echo "QA output created by $seq"

# get standard filters
. ./common.product
. ./common.filter

trap "rm -f $tmp.*; exit" 0 1 2 3 15

# real QA test starts here
#

# Logs are built for 70 samples (-s70) (see Makefile)
# The sample metric rates are 100msec, 500msec, 900msec
# Theoretically,....
# This means that (x + x/5 + x/9 = 70) for integral x.
# => 59x = 70 * 45
# => x ~= 53.39
# But x is integral
# So, x = 54, x/5 = 10, x/9 = 6 (54 + 10 + 6 = 70)
#
# Note below that n[i] is not incremented on its 1st occurrence
# => expect values of 53, 9, 5

for arch in tmparch/bar tmparch/mv-bar tmparch/noti-bar
do
    echo | tee -a $seq_full
    echo "=== $arch ===" | tee -a $seq_full
    pmdumplog $arch \
    | sed \
	-e '/^[0-9]/{
s/[0-9][0-9]* metrics*//
N
s/\n/ /
}' \
	-e 's/:/ /g' \
	-e '/(pmcd\./d' \
    | $PCP_AWK_PROG '
/^[0-9]/	{ print $3,$NF }' \
    | $PCP_AWK_PROG '
	    { if (l[$2] != "") {
		delta = $1 - l[$2];
		if (delta < 0)
		    delta += 60;
		range = ""
		# debugging sanity check ... values more than 10% different to expected
		if (delta*1000 < 0.9*$2)
		    range = " >10% SMALLER than expected lower bound (" 0.9*$2 "msec)"
		else if (delta*1000 > 1.1*$2)
		    range = " >10% LARGER than expected upper bound (" 1.1*$2 "msec)"
		print $2 ": @" $1 " delta=" delta*1000 "msec" range >>"'"$seq_full"'"
		t[$2] += delta
		n[$2]++
	      }
	      l[$2] = $1
	    }
    END	{ for (i in n) {
		printf "%d msec requested: ",i
		if (n[i] != 0)
		    av = 1000*t[i]/n[i]
		else
		    av = 0
		print i ": sum delta=" t[i] " nobs=" n[i] " av=" av >>"'"$seq_full"'"
		if (i == 100) {
		    if (51 <= n[i] && n[i] <= 54)
			printf "no. of samples within range, "
		    else
			printf "no. of samples (%d) unexpected, ",n[i]," not in range 51 ... 54, "
		}
		else if (i == 500) {
		    if (9 <= n[i] && n[i] <= 11)
			printf "no. of samples within range, "
		    else
			printf "no. of samples (%d) unexpected, ",n[i]," not in range 9 ... 11, "
		}
		else if (i == 900) {
		    if (4 <= n[i] && n[i] <= 6)
			printf "no. of samples within range, "
		    else
			printf "no. of samples (%d) unexpected, ",n[i]," not in range 4 ... 6, "
		}
		else
		    printf "Botch: i=%d unexpected, ",i
		if (0.9 * i <= av && av <= 1.1 * i)
		    printf "avg within 10%% of requested delay\n"
		else
		    printf "avg (%.2f msec) outside 10%% of requested delay range %.2f ... %.2f msec\n",av,0.9*i,1.1*i
	      }
	    }' \
    | LC_COLLATE=POSIX sort
done
